import mysql.connector
import mysql.connector as mc
from util.DbConnectUtil import ConnectDb


def get_sql_content(*args):
    """
    简单测试 Python 连接数据库的操作
    :param args: 连接需要传递的参数
    :return:
    """
    print(args)
    con = ConnectDb.get_connect_db(args)
    #     处理sql 语句进行查询 操作
    sql = 'select * from students;'
    # 如果想要执行某一个 sql  语句 需要使用 游标 对象
    cursor = con.cursor()
    # 通过创建 的 cursor 来执行 我们的 sql 语句
    cursor.execute(sql)
    # 执行完 sql 语句后 进行 获取执行完毕之后的结果
    value = cursor.fetchall()
    print(value)

    # 模拟登录的操作 会产生  Sql 注入的问题


def sql_inject(username, password, *args):
    """
    模拟数据库操作的过程中可能会出现的 SQl注入的问题
    :return:
    """
    con = ConnectDb.get_connect_db(args)
    sql = "select * from python_test_table where username = '" + username + "' and `password` = '" + password + "'"
    print(sql)
    cursor = con.cursor()
    cursor.execute(sql)
    v = cursor.fetchall()
    print(v)
    cursor.close()
    con.close()

    # 模拟登录的操作 避免产生  Sql 注入的问题


def sql_avoid_inject(username, password, *args):
    """
    模拟数据库操作的过程
    :return:
    """
    data = (username, password)
    con = ConnectDb.get_connect_db(args)
    sql = "select * from python_test_table where username = %s and `password` = %s"
    print(sql)
    cursor = con.cursor()
    cursor.execute(sql, data)
    v = cursor.fetchall()
    print(v)
    cursor.close()
    con.close()

    # 向数据库 的表中 插入数据


# 在 使用 Python 操作数据库时 如果使用 增删 改 需要 提交事务

def insert_sql_strip_data_only(email, age, *args):
    """
    模拟数据库操作的过程
    :return:
    """
    data = (email, age)
    con = ConnectDb.get_connect_db(args)
    sql = "insert into email(`email`,`age`) values (%s,%s)"
    print(sql)
    cursor = con.cursor()
    try:
        cursor.execute(sql, data)
        con.commit()
        print('插入成功！')
    except:
        print('插入失败')
    cursor.close()
    con.close()

    # 向数据库 的表中 插入数据 多行插入


# 在 使用 Python 操作数据库时 如果使用 增删 改 需要 提交事务

def insert_sql_strip_data_multiple(data, *args):
    """
    模拟数据库操作的过程
    :return:
    """
    con = ConnectDb.get_connect_db(args)
    sql = "insert into email(`email`,`age`) values (%s,%s)"
    print(sql)
    cursor = con.cursor()
    try:
        cursor.executemany(sql, data)
        con.commit()
        print('插入成功！')
    except:
        print('插入失败')
    cursor.close()
    con.close()

    # 从数据库中删除一条记录数


# 在 使用 Python 操作数据库时 如果使用 增删 改 需要 提交事务

def delete_by_id(id, *args):
    """
    模拟数据库操作的过程
    :return:
    """
    con = ConnectDb.get_connect_db(args)
    sql = "delete from email where age = %s"
    print(sql)
    cursor = con.cursor()
    try:
        cursor.execute(sql, id)
        con.commit()
        print('删除成功！')
    except:
        print('删除失败')
    cursor.close()
    con.close()

    # 从数据库中修改一条记录数


# 在 使用 Python 操作数据库时 如果使用 增删 改 需要 提交事务

def update_by_id(data, *args):
    """
    模拟数据库操作的过程
    :return:
    """
    con = ConnectDb.get_connect_db(args)
    sql = "update email set email = %s where age = %s"
    print(sql)
    cursor = con.cursor()
    try:
        cursor.execute(sql, data)
        con.commit()
        print('修改成功！')
    except:
        print('修改失败')
    cursor.close()
    con.close()

    # 事务
    # 从数据库中修改一条记录数


# 在 使用 Python 模拟事务的操作

def transaction(id1, id2, m, *args):
    """
    :param id1: 转账人
    :param id2: 收账人
    :param m: 钱
    :return: None
    """
    con = ConnectDb.get_connect_db(args)
    cursor = con.cursor()
    try:
        sql1 = "update python_test_table set money = money - %s where i = %s"
        sql_data = (m, id1)
        cursor.execute(sql1, sql_data)
        print(sql1)
        sql2 = "update python_test_table set money = money + %s where id = %s"
        sql2_data = (m, id2)
        cursor.execute(sql2, sql2_data)
        print(sql2)

        con.commit()
        print('转账成功')
    except mysql.connector.Error as e:
        con.rollback()
        print('转账失败', str(e))

    cursor.close()
    con.close()



#  ctrl + shift + y
#  ctrl + shift + x
#  ctrl + shift + o   esc 退出

# 项目中  入口函数 出口函数 一个
if __name__ == '__main__':
    # get_sql_content('Hanamaki', '192.168.0.152', '3306', 'root', 'examtest')

    # sql_inject('hanamaki', '123456', 'Hanamaki', '192.168.0.152', '3306', 'root', 'examtest')
    # sql_inject(" ' or '1=1", " ' or '1=1", 'Hanamaki', '192.168.0.152', '3306', 'root', 'examtest')

    # sql_avoid_inject('hanamaki', '123456', 'Hanamaki', '192.168.0.152', '3306', 'root', 'examtest')
    # sql_avoid_inject(" ' or '1=1", " ' or '1=1", 'Hanamaki', '192.168.0.152', '3306', 'root', 'examtest')

    # insert_sql_strip_data_only('123456@qq.com', '50', 'Hanamaki', '192.168.0.152', '3306', 'root', 'examtest')
    # data = [
    #     ('123@qq.com', '1'),
    #     ('123@qq.com', '2')
    # ]

    # data = (
    #     ['234@qq.com', '4'],
    #     ['234@qq.com', '7']
    # )
    # insert_sql_strip_data_multiple(data, 'Hanamaki', '192.168.0.152', '3306', 'root', 'examtest')

    # delete_by_id((1,), 'Hanamaki', '192.168.0.152', '3306', 'root', 'examtest')
    # update_by_id(('34@163.com', 2,), 'Hanamaki', '192.168.0.152', '3306', 'root', 'examtest')
    transaction(1, 2, 500, 'Hanamaki', '192.168.0.152', '3306', 'root', 'examtest')
